#pragma once

#include "../share/std_err.h"
#include "vxi11.h"

// instrument response 缓冲区大小(字节数)
#define MAX_INST_RESP_BUFSIZE 2*1024*1024

// instrument 结构
typedef struct {
    // instrument id
    size_t id;
	// response 缓冲区中当前有效数据长度
	size_t resplen;
	// response 缓冲区
	char resp[MAX_INST_RESP_BUFSIZE];
} instrument_t;

// 用于处理 VXI11 write 指令的函数声明
typedef Device_ErrorCode (*vxi11_write_handler_t)(void *cookie, instrument_t *inst, const char *data, size_t datalen);


#ifdef __cplusplus
extern "C" {
#endif

/**
 * 获取 instrument_id 对应的 instrument 数据结构
 */
instrument_t* vxi11_server_get_instrument(size_t instrument_id);

/**
 * 阻塞式运行 VXI11 Server，直到调用 vxi11_server_exit()
 * @param instrument_count 总共支持多少个 instrument
 * @param tcp_enable 是否启用 TCP 协议
 * @param udp_enable 是否启用 UDP 协议
 * @param handler 用于处理 VXI11 write 指令的回调函数
 * @param cookie 用于 handler 的回调参数
 * @return 标准错误码
 */
std_err_t vxi11_server_run(size_t instrument_count, bool_t tcp_enable, bool_t udp_enable, vxi11_write_handler_t handler, void *cookie);

/**
 * 退出 VXI11 Server
 */
void vxi11_server_exit();

#ifdef __cplusplus
} //extern "C"
#endif
